"""
1，查找测试用例，生成测试套件
   unittest.Testloader()/unittest.defaultTestloader
   1,实例化Testloader
   2，调用discover方法
2，运行测试套件生成测试报告

  1创建报告文件名及路径
  2以写入模式打开文件
  3实例化htmltestruner得到runer队象
  4调用实例方法执行官测试套件
  5关闭文件
3 清理报告
    方案1全部干掉
            os.dirlist获取某个目录下全部文件
            循环删除每个文件os。remove()
    方案2保留最新n个
    os.dirlist()获取某个目录下全部文件
    切片删除每一个文件os.remove（）


    方案三：按照文件的生成时间排序进行清理
    os.dirlist()获取目录下全部文件，得到一个列表
    os.path.getctime（）获取文件的生成时间
    使字典推导式得到一个字典：文件名，文件的创建时间进行排序
    截取保留n个文件
"""
import unittest
import os
from 接口框架第一周.HTMLTestRunner import HTMLTestReportCN
import time
from 接口框架第一周.common.log import logging
from 接口框架第一周.common.sendemail import SendEmail

# 1，查找测试用例，生成测试套件
def create_suite():
    #获取测试用例路径
    case_dir=os.path.dirname(__file__)+"/testCase"
#
#    1,实例化Testloader
    loader= unittest.TestLoader()
#    2，调用discover方法
    suite = loader.discover(start_dir=case_dir,pattern='Test*.py')
    #查看
    logging.info(f'创建好的测试稿件：{suite}')

    return suite


#单利模式


# 3 清理报告
#     方案1全部干掉
def auto_clear():
    #获取报告文件路径
    dir = os.path.dirname(__file__)+"/testReport/"
#   os.dirlist获取某个目录下全部文件
    file_list = os.listdir(dir)
    #排序生成报告
    #不用手动修改文件名字，动态获取并删除
    #定义一个字典
    dict1={}
    #使用字典推导式得到文件名和文件时间的字典
    for i in file_list:
        #获取每个文件的创建时间
        t  =os.path.getctime(dir+'/'+i)
        dict1[t]=dir+'/'+i
        #按着时间竟排序
        list1 =list(dict1.keys())
        list1.sort()
    #截取最后三个文件列表
    for i in list1[:-2]:
        os.remove(dict1[i])



if __name__ == '__main__':
    #清理报告
    auto_clear()
    #生成测试套件
    suite = create_suite()

    # 2，运行测试套件生成测试报告
    #获取时间
    cur_time = time.strftime("%Y_%m_%d_%H_%M_%S",time.localtime())
    # 创建报告文件名及路径加拼接时间
    report = os.path.dirname(__file__)+"/testReport/"+cur_time+"report.html"


    # 以写入模式打开文件
    with open(report,"wb")as fp:
        # 以写入模式打开文件
        runer  = HTMLTestReportCN(stream=fp,title="接口自动化测试报告",description="接口测试结果",verbosity=2,)
        # 实例化htmltestruner得到runer队象
        runer.run(suite)
        # 调用实例方法执行官测试套件
        # 5
        # 关闭文件
    # 发送邮件
    se= SendEmail()
    se.send(report)